/*
 * @Descripttion: Lutongli代码
 * @version: 1.0.0
 * @Author: LutongLi
 * @Date: 2025-06-03 00:06:42
 * @LastEditTime: 2025-06-04 23:46:43
 */
package apps

import (
	"fmt"

	"github.com/gin-gonic/gin"

	"gitee.com/king_max/restful-api-demo/apps/host"
)

//IOC 容器层：管理所有服务的实例


var (
	HostService host.Service
	implApps = map[string]ImplService{}
	ginApps = map[string]GinService{}
)

func RegsitryImpl(svc ImplService) {

	//服务实例注册到svcs map当中
	svcName := svc.Name()
	if _,ok := implApps[svcName];ok{
		panic(fmt.Sprintf("service %s has been registried",svcName))
	}
		implApps[svc.Name()]= svc
	//更加对象满足的接口来注册具体的服务
	if v,ok := svc.(host.Service);ok{
		HostService = v
	}
	return
}


type ImplService interface{
	Config()
	Name() string
}


func RegsitryGin(svc GinService) {

	if _,ok := ginApps[svc.Name()];ok{
		panic(fmt.Sprintf("service %s has been registried",svc.Name()))
	}
		ginApps[svc.Name()]= svc
	//更加对象满足的接口来注册具体的服务
}


//注册gin编写的handler
//比如编写的http服务A，只需要实现Registry方法，就能把handler注册Root Router
type GinService interface{
	Regsitry(r gin.IRouter)
	Config()
	Name() string
}



//用户初始化 注册到IOC容器里面的所有服务
func InitImpl(){
	for _,v:=range implApps {
		//实现了服务的自动注册
		v.Config()
	}
}

func InitGin(r gin.IRouter){
	for _,v:=range ginApps {
		//先初始化好所有的对象
		v.Config()
	}
	for _,v:=range ginApps {
		//完成http handler的注册
		v.Regsitry(r)
	}
}


//返回一个对象，任何类型都可以，使用时，由使用方进行断言

func GetImpl(name string) interface{}{
	for k,v := range implApps{
		if k == name {
			return v
		}
	}
	return nil
}